﻿#ifndef ANALYZER_SCHEDULER_H
#define ANALYZER_SCHEDULER_H
#include <map>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <vector>
#include <thread>
#include <memory> // 添加智能指针

// 算法调度模块
namespace AVSAnalyzer {
	class Config;
	class Worker;
	class Algorithm;
	struct Control;
	struct AlarmImage;
	struct Alarm;

	class Scheduler
	{
	public:
		friend class Worker;
		friend class Analyzer;  // 添加 Analyzer 为友元类

		Scheduler(Config* config);
		~Scheduler();
	public:
		Config* getConfig();
		bool initAlgorithm();
		void loop();

		void setState(bool state);
		bool getState();

		void addAlarm(Alarm* alarm);

		// ApiServer 对应的http接口函数 start
		int  apiControls(std::vector<Control*>& controls);
		Control* apiControl(std::string& code);
		void apiControlAdd(Control* control, int& result_code, std::string& result_msg);
		void apiControlCancel(Control* control, int& result_code, std::string& result_msg);
		// ApiServer 对应的函数 end

		// 获取所有算法实例
		const std::vector<std::unique_ptr<Algorithm>>& getAlgorithms() const {
			return mAlgorithms;
		}

	private:
		Config* mConfig;
		bool  mState;

		// 使用智能指针管理算法实例
		std::vector<std::unique_ptr<Algorithm>> mAlgorithms;
		std::mutex                     mAlgorithmsMtx;

		std::map<std::string, Worker*> mWorkerMap; 			// <control.code,Worker*>
		std::mutex                     mWorkerMapMtx;
		int  getWorkerSize();
		bool isAdd(Control* control);
		bool addWorker(Control* control, Worker* worker);
		bool removeWorker(Control* control);				//加入到待实际删除队列
		Worker* getWorker(Control* control);

		std::queue<Worker*> 	 mTobeDeletedWorkerQ;		// 待实际删除队列
		std::mutex               mTobeDeletedWorkerQ_mtx;	// 待实际删除队列互斥锁
		std::condition_variable  mTobeDeletedWorkerQ_cv;	// 待实际删除队列条件变量
		void handleDeleteWorker();						    // 处理待实际删除队列

		//报警处理 start
		std::thread* mLoopAlarmThread;						// 报警处理线程
		static void loopAlarmThread(void* arg);				// 报警处理线程函数
		void handleLoopAlarm();								// 处理报警队列
		std::queue<Alarm*> mAlarmQ;							// 报警队列
		std::mutex         mAlarmQ_mtx;						// 报警队列互斥锁
		bool getAlarm(Alarm*& alarm, int& alarmQSize);		// 获取报警
		void clearAlarmQueue();								// 清空报警队列
		//报警处理 end
	};
}
#endif //ANALYZER_SCHEDULER_H